<?php
/**
 * User.php
 * phpstorm_company_name_str - phpstorm_company_product_name
 * ***************************************************************************************************************************
 * 版权声明: Copyright ©2019 phpstorm_company_name_str All rights reserved
 * 官方网站: phpstorm_company_product_url
 * 许可声明: 这不是一个自由软件！您只能在购买源代码后或者经 phpstorm_company_name_str 官方授权的前提下对程序代码进行修改和使用，
 * 任何企业或个人都不得在源代码上以任何形式任何目的的再次发布和销售以及镜像或复制,包括但不限于已购买源代码和官方授权者。
 * 警 告  : 如若您或贵司未经正式购买渠道获得授权，请立即停止侵权行为，我们已经委派 phpstorm_company_auth_legal 作为我们侵权
 * 起诉的法律代表，还请您或贵司尊重商业版权以及劳动成果，自觉停止侵权行为。您也可匿名举报侵权行为，一旦您的举报被证实，我们
 * 将会以本版本零售价的 phpstorm_company_product_percent_money% 现金给您，以便作为您的辛苦奖励。同时，我们也将竭尽全力保证您的隐私安全。举报邮箱: phpstorm_company_product_report_mail
 * 协议约定: 本产品遵守 << phpstorm_company_product_protocol >> 的约束,您或贵司也可以访问 phpstorm_company_product_protocol 了解更多详情信息。
 * 致 谢  : 感谢您或贵司对我们产品的支持和热爱，我们将不定期对本产品进行更新和修复bug。还请您和贵司多多指导。更多问题资讯请访问
 * phpstorm_company_product_help_url ,如果您正在对此版本进行二次开发，提bug或者需求可以发送到@author邮箱,或者提交工单。
 * 工单地址是: phpstorm_company_product_ticket_url 我们将尽快为您提出合理的解决方案。
 * 其 他  : 您或贵司也可以登录 phpstorm_company_product_doc_url 查看相关的文档资料以及FAQ！
 * ***************************************************************************************************************************
 * @product ctmoncms
 * @desc
 * @author justary <justary@126.com>
 * @date 2024/06/24 12:51
 * @version phpstorm_company_product_version
 * @copyright phpstorm_company_product_copyright
 */

/**
 * @package app\v1\controller
 *
 * @filesource User.php
 * @author justary <justary@126.com>
 * @date 2024/06/24 12:51
 * @link phpstorm_product_licence
 * @version phpstorm_company_product_version
 * @copyright phpstorm_company_product_copyright
 */


namespace app\v1\controller;


use app\data\components\SitemapIndex;
use app\data\logic\PageLogic;
use app\v1\BaseController;
use samdark\sitemap\Sitemap;
use think\App;
use think\facade\Env;
use think\facade\Log;
use think\Request;

/**
 * @OA\Tag(
 *   name="user",
 *   description="用户管理"
 * )
 */
class Config extends BaseController
{
    protected PageLogic $logic;

    public function __construct(App $app)
    {
        $this->logic = new PageLogic();
        parent::__construct($app);
    }

    /**
     *
     * @OA\Get(
     *     path="/friend/getFriendList",
     *     summary="获取好友列表",
     *     description="获取好友列表描述",
     *     operationId="getFriendList",
     *     tags={"friend"},
     *     @OA\Parameter(
     *         name="Accept-Language",
     *         in="header",
     *         description="i18n support",
     *         required=false,
     *         allowEmptyValue=true,
     *         @OA\Schema(
     *             type="string",
     *             example="zh-cn"
     *         )
     *     ),
     *     @OA\Response(
     *          response=200,
     *          description="show success status",
     *          @OA\MediaType(
     *              mediaType="application/json",
     *              @OA\Schema(ref="#/components/schemas/Success")
     *          )
     *     )
     * )
     */
    public function index()
    {
        $result = $this->logic->getConfigList();
        if ($result) {
            return $this->respMsg(\config('code.SUCCESS'), \lang('SUCCESS'), $result, count($result));
        } else {
            return $this->respMsg(\config('code.FAILURE'), \lang('FAILURE'));
        }
    }


       public function create()
    {
        $list = $this->logic->getNavigateList();
        $baseUrl = Env::get('WEBSITE.WEBSITE_DOMAIN');
        $result = [];
        $fileName = "sitemap_index.xml";
        // 添加sitemap模块
        $sitemap = new Sitemap($fileName);
        $sitemap->addItem($baseUrl, time(), Sitemap::HOURLY, 0.7); // 生成静态sitemap
        foreach ($list as $item => $value) {
            $writeurl = $value['rewrite_url'] ?? $value['writeurl'];
            $firstChar = substr($writeurl, 0, 1);
            if ($firstChar != "/") {
                $writeurl = "/" . $writeurl;
            }
            $priority = 0.7;
            if ($value['en_name'] == 'index') {
                $priority = 0.9;
            }
            $sitemap->addItem($baseUrl . $writeurl . '.html', time(), Sitemap::HOURLY, $priority); // 生成静态sitemap
            if (count($value['children']) > 0) {
                foreach ($value['children'] as $child => $childValue) {
                    if (array_key_exists('rewrite_url', $childValue) || array_key_exists('writeurl', $childValue)) {
                        $writeurl = $childValue['rewrite_url'] ?? $childValue['writeurl'];
                        $firstChar = substr($writeurl, 0, 1);
                        if ($firstChar != "/") {
                            $writeurl = "/" . $writeurl;
                        }
                        $sitemap->addItem($baseUrl . $writeurl . '.html', time(), Sitemap::HOURLY, 0.7);
                    }
                }
            }
        }
        // 新闻详情的sitemap补充
        $cmsCat = $this->logic->getCmsCatList(['all' => 1]);
        for ($i = 0; $i < count($cmsCat); $i++) {
            // 所有新闻
            $cmsList = $this->logic->getCmsList(['cat_id' => $cmsCat[$i]['cat_id']]);
            for ($j = 0; $j < count($cmsList); $j++) {
                $writeurl = $cmsList[$j]['urlrewriter'];
                $firstChar = substr($writeurl, 0, 1);
                if ($firstChar != "/") {
                    $writeurl = "/" . $writeurl;
                }
                $sitemap->addItem($baseUrl . $writeurl . '.html', time(), Sitemap::HOURLY, 0.8);
            }
        }
        // 产品列表
        $productList = $this->logic->getProductsList(['all' => 1]);
        for ($i = 0; $i < count($productList); $i++) {
            if ($productList[$i]['rewrite_url']) {
                $writeurl = $productList[$i]['rewrite_url'];
                $firstChar = substr($writeurl, 0, 1);
                if ($firstChar != "/") {
                    $writeurl = "/" . $writeurl;
                }
                $sitemap->addItem($baseUrl . $writeurl . '.html', time(), Sitemap::HOURLY, 0.8);

            }
        }
        $sitemap->write();
        return $this->respMsg(\config('code.SUCCESS'), \lang('SUCCESS'), $sitemap->getWrittenFilePath());
    }

    /**
     * 创建配置文件
     * @param Request $request
     * @return \think\response\Json
     */
    public function save(Request $request)
    {
        $param = $request->param();
        $result = $this->logic->createNewConfig($param);
        if ($result['state']) {
            return $this->respMsg(\config('code.SUCCESS'), \lang('SUCCESS'));
        } else {
            return $this->respMsg(\config('code.FAILURE'), \lang('FAILURE'));
        }
    }

    /**
     * 读取配置文件
     * @param $id
     * @return \think\response\Json
     */
    public function read($id)
    {
        if ($id > 0) {
            $result = $this->logic->getConfigDetail($id);
        } else {
            $code = $this->request->get('code');
            $result = $this->logic->getConfigDetailByCode($code);
        }
        if ($result['state']) {
            return $this->respMsg(\config('code.SUCCESS'), \lang('SUCCESS'), $result['data']);
        } else {
            return $this->respMsg(\config('code.FAILURE'), \lang('FAILURE'));
        }
    }

    public function edit($id)
    {
        //
        echo 'edit';
    }

    /**
     * 更新配置文件
     * @param Request $request
     * @param $id
     * @return \think\response\Json
     */
    public function update(Request $request, $id)
    {
        //
        $param = $request->param();
        if ($param['id']) {
            unset($param['id']);
        }

        $checkData['id'] = $id;
        $result = $this->logic->updateConfig($id, $param, $checkData);
        if ($result['state']) {
            return $this->respMsg(\config('code.SUCCESS'), \lang('SUCCESS'));
        } else {
            return $this->respMsg(\config('code.FAILURE'), \lang('FAILURE'));
        }
    }

    public function delete($id)
    {

        $result = $this->logic->deleteConfig($id);
        if ($result['state']) {
            return $this->respMsg(\config('code.SUCCESS'), \lang('SUCCESS'));
        } else {
            return $this->respMsg(\config('code.FAILURE'), \lang('FAILURE'));
        }
    }

    /**
     * 移除文件夹下的所有
     * @param $folderPath string 目标文件夹
     * @return void
     */
    private function removeFolder($folderPath)
    {
        $items = scandir($folderPath);
        foreach ($items as $item) {
            if ($item != "." && $item != "..") {
                $itemPath = $folderPath . '/' . $item;

                if (is_dir($itemPath)) {
                    $this->removeFolder($itemPath);
                    rmdir($itemPath);
                } else {
                    unlink($itemPath);
                }
            }
        }
    }

    /**
     * 复制文件夹
     * @param $source string 源文件夹路径
     * @param $destination string 目标文件夹路径
     * @return void
     */
    private function copyFolder($source, $destination)
    {
        if (!is_dir($destination)) {
            mkdir($destination, 0777, true);
        }

        $handle = opendir($source);
        while (($file = readdir($handle)) !== false) {
            if ($file != "." && $file != "..") {
                $sourcePath = $source . '/' . $file;
                $destinationPath = $destination . '/' . $file;

                if (is_dir($sourcePath)) {
                    $this->copyFolder($sourcePath, $destinationPath);
                } else {
                    copy($sourcePath, $destinationPath);
                }
            }
        }
        closedir($handle);
    }
}
